package persistent

import (
	"fmt"

	"gitee.com/leonscript/sally/v2/domain/aggregate"
	"gorm.io/gorm"
)

// ApplyBusinessParamsCondition 将 BusinessParams 转换为 GORM 查询条件
// 该函数用于在数据库查询中应用业务参数过滤条件
//
// 参数说明:
//   - db: GORM 数据库实例
//   - businessParams: 业务参数映射，包含需要过滤的键值对
//
// 返回值:
//   - *gorm.DB: 应用了业务参数条件的数据库查询实例
//
// 功能说明:
//   1. 遍历业务参数中的每个键值对
//   2. 根据值的类型构造相应的 JSON 查询条件
//   3. 使用 JSON_CONTAINS 函数在 workflow.business_params 字段中查找匹配项
func ApplyBusinessParamsCondition(db *gorm.DB, businessParams aggregate.BusinessParams) *gorm.DB {
	if businessParams == nil {
		return db
	}

	for key, value := range businessParams {
		// 根据值的类型构造正确的JSON格式
		var jsonValue string
		switch v := value.(type) {
		case string:
			jsonValue = fmt.Sprintf(`{"%s": "%s"}`, key, v)
		case bool:
			jsonValue = fmt.Sprintf(`{"%s": %t}`, key, v)
		case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
			jsonValue = fmt.Sprintf(`{"%s": %v}`, key, v)
		case float32, float64:
			jsonValue = fmt.Sprintf(`{"%s": %v}`, key, v)
		default:
			// 对于其他类型，转换为字符串
			jsonValue = fmt.Sprintf(`{"%s": "%v"}`, key, v)
		}
		db = db.Where("JSON_CONTAINS(workflow.business_params, ?)", jsonValue)
	}
	return db
}